/// 智能指针：为了提供与普通指针类似的行为，即为了能够解引用被指向类型的调用方法，智能指针通常会实现Deref特征
/// 特征：Deref, DerefMut
/// 种类：
///     Box<T>     堆资源分配, 比如创建递归类型定义
///     Rc<T>      引用计数指针, 单线程环境
///     Arc<T>     原子引用计数, 多线程环境
///     Cell<T>    提供实现了Copy特征的类型的内部可变性
///     RefCell<T> 提供了类型的内部可变性，并且不需要实现Copy特征

/// Box<T>
fn box_ref<T>(b: T) -> Box<T> {
    let a = b;
    Box::new(a)
}

struct Foo;
struct Node {
    data: u32,
    next: Option<Box<Node>>  // 链表
}


fn main() {
    let boxed_one = Box::new(Foo);
    let unboxed_one = *boxed_one; // 解引用
    box_ref(unboxed_one);

    let _a = Node {data: 33, next: None};
}